<?php
// 应用公共文件
if(!function_exists('buildTree'))
{
    /**
     * 递归构建树形结构
     * @param array $data 原始数据数组
     * @param string $key 主键字段名 默认'id'
     * @param string $parent_id 父级ID字段名 默认'parent_id'
     * @param string $child 子节点字段名 默认'children'
     * @param mixed $parentValue 当前父节点值 默认0
     * @return array 树形结构数组
     */
    function buildTree(array $data, string $key = 'id', string $parent_id = 'parent_id', string $child = 'children', int $parentValue = 0): array
    {
        $tree = [];
        foreach ($data as $item) {
            // 匹配当前层级的父节点
            if ($item[$parent_id] == $parentValue) {
                // 递归查找子节点
                $children = buildTree($data, $key, $parent_id, $child, $item[$key]);
                if (!empty($children)) {
                    $item[$child] = $children;
                }
                $tree[] = $item;
            }
        }
        return $tree;
    }
}

if (!function_exists('buildTreeWithRemove'))
{
    /**
     * 递归构建树形结构并移除已处理元素
     * @param array &$data 原始数组的引用（会被修改）
     * @param string $key 主键字段名（默认'id'）
     * @param string $parent_id 父级字段名（默认'parent_id'）
     * @param string $child 子节点字段名（默认'children'）
     * @param mixed $parentValue 当前父节点值（默认0）
     * @return array 树形结构
     */
    function buildTreeWithRemove(array $data, string $key = 'id', string $parent_id = 'parent_id', string $child = 'children', int $parentValue = 0): array
    {
        $tree = [];
        foreach ($data as $index => &$item) {
            if ($item[$parent_id] == $parentValue) {
                // 递归前保存当前元素ID
                $currentId = $item[$key];

                // 递归查找子节点（传递当前元素的ID作为父值）
                $children = buildTreeWithRemove($data, $key, $parent_id, $child, $currentId);

                // 动态移除已处理元素
                unset($data[$index]);

                // 构建树结构
                if (!empty($children)) {
                    $item[$child] = $children;
                }
                $tree[] = $item;
            }
        }
        return $tree;
    }
}


/**
 * @notes 随机生成token值
 * @param string  | int $extra
 * @return string
 * @author 段誉
 * @date 2021/12/28 18:24
 */
function create_token(string | int  $extra = '') : string
{
    $salt = env('project.unique_identification', 'matrix');
    $encryptSalt = md5( $salt . uniqid());
    return md5($salt . $extra . time() . $encryptSalt);
}
